package com.example.controller;

import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.dev33.satoken.annotation.SaIgnore;
import com.example.common.api.ApiResult;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.core.io.ClassPathResource;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.util.FileCopyUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.io.InputStreamReader;
import java.nio.charset.StandardCharsets;

/**
 * 系统初始化控制器
 */
@Slf4j
@RestController
@RequestMapping("/init")
@RequiredArgsConstructor
public class InitController {

    private final JdbcTemplate jdbcTemplate;

    /**
     * 初始化数据库数据
     * 注意：此接口不需要登录即可访问，仅用于系统初始化
     * 同时支持GET和POST请求
     */
    @SaIgnore
    @GetMapping("/data")
    public ApiResult<String> initDataGet() {
        return initDataInternal();
    }
    
    /**
     * 初始化数据库数据 - POST方法
     * 由于前端可能使用POST请求，添加对POST的支持
     */
    @SaIgnore
    @PostMapping("/data")
    public ApiResult<String> initDataPost() {
        return initDataInternal();
    }
    
    /**
     * 内部初始化方法，避免代码重复
     */
    private ApiResult<String> initDataInternal() {
        try {
            // 读取SQL文件内容
            ClassPathResource resource = new ClassPathResource("db/data/init_data.sql");
            String sql = FileCopyUtils.copyToString(new InputStreamReader(resource.getInputStream(), StandardCharsets.UTF_8));
            
            // 执行SQL语句（按分号分隔）
            String[] sqlStatements = sql.split(";");
            for (String statement : sqlStatements) {
                if (!statement.trim().isEmpty()) {
                    jdbcTemplate.execute(statement);
                }
            }
            
            log.info("数据库初始化成功");
            return ApiResult.success("数据库初始化成功");
        } catch (Exception e) {
            log.error("数据库初始化失败", e);
            return ApiResult.failed("数据库初始化失败: " + e.getMessage());
        }
    }

    /**
     * 重置数据库数据（需要system:manage权限）
     * 同时支持GET和POST请求
     */
    @SaCheckPermission("system:manage")
    @GetMapping("/reset")
    public ApiResult<String> resetDataGet() {
        return initDataInternal();
    }
    
    /**
     * 重置数据库数据 - POST方法
     */
    @SaCheckPermission("system:manage")
    @PostMapping("/reset")
    public ApiResult<String> resetDataPost() {
        return initDataInternal();
    }
} 